òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/11681

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

# 뺯
import jqdata
import math 
import pandas as pd


log.set_level('order', 'error')

# ʼ趨ҪĹƱ׼ȵ
def initialize(context):
    # һȫֱ, ҪĹƱ
    # 000001(Ʊ:ƽ)
    # 趨300Ϊ׼
    set_benchmark('000300.XSHG')
    # ̬Ȩģʽ(ʵ۸)
    set_option('use_real_price', True)
    
    run_monthly(handle, 1,'before_open')
    set_order_cost(OrderCost(open_tax=0, close_tax=0, open_commission=0.0003, close_commission=0.0013, close_today_commission=0, min_commission=0), type='stock')
    set_slippage(FixedSlippage(0.02))   

# ÿλʱ(ز,ÿһ,,ÿӵһ)һ
def handle(context):

    buylist = check_stock(context) 
   
    for  stock in context.portfolio.positions:
        if stock not in buylist:
            order_target_value(stock, 0)
   
    for stock in buylist:
        order_target_value(stock, context.portfolio.total_value/len(buylist))

def check_stock(context):
    
    stock_list =['000001.XSHE', '002142.XSHE', '002807.XSHE', '002839.XSHE', '600000.XSHG', '600015.XSHG', '600016.XSHG', '600036.XSHG', '600908.XSHG', '600919.XSHG', '600926.XSHG', '601009.XSHG', '601128.XSHG', '601166.XSHG', '601169.XSHG', '601229.XSHG', '601288.XSHG', '601328.XSHG', '601398.XSHG', '601818.XSHG', '601838.XSHG', '601939.XSHG', '601988.XSHG', '601997.XSHG', '601998.XSHG', '603323.XSHG']
    df=pd.DataFrame(index =stock_list, columns =['ROE','PB'])
    for stk1 in stock_list:
        P = get_fundamentals_continuously(query(indicator.code, valuation.pb_ratio).filter(valuation.code==stk1),count=250)
        RO = get_fundamentals_continuously(query(indicator.code, indicator.roe).filter(valuation.code==stk1),count=250)
        df['PB'][stk1]=P['pb_ratio'].values.mean()
        df['ROE'][stk1] = RO['roe'].values.mean()/100
      
    df = df[df['ROE'] > -1]
    
    
    
    df["double_time"] =  df.apply(lambda row: round(math.log(2.0 * row['PB'] , (1.0+row['ROE'])),2), axis=1)
    #Сй
    df = df.sort("double_time")

    print context.current_dt.strftime('%Y-%m-%d') +' ѡΪ '+ str(df.index[:5].values)[1:-1]
    return df.index[:5]#ֱʾı Ĭ5


